/*
 * miniupnprender @ Baidu

 *MiniUPnP project
 * http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
 *
 * Copyright (c) 2006-2008, Thomas Bernard
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * The name of the author may not be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef BAIDU_IOT_TINYDU_IOT_OS_SRC_MINIUPNPRENDER_UPNPDESCGEN_H
#define BAIDU_IOT_TINYDU_IOT_OS_SRC_MINIUPNPRENDER_UPNPDESCGEN_H

#ifdef __cplusplus
extern "C" {
#endif
/*data struct beigin*/

/**for the root description
 * The child list reference is stored in "data" member using the
 * INITHELPER macro with index/nchild always in the
 * same order, whatever the endianness
 */
struct XMLElt {
    const char* eltname; /* begin with '/' if no child */
    const char* data; /* Value */
};

/**
 *for service description
 */
struct ServiceDesc {
    const struct Action* action_list;
    const struct StateVar* service_state_table;
};

struct Action {
    const char* name;
    const struct Argument* args;
};

struct Argument {
    const char* name; /*the name of the argument */
    unsigned char dir; /*1 = in, 2 = out*/
    unsigned char related_var; /*index of the related variable*/
};

struct StateVar {
    const char* name;
    unsigned char itype; /* MSB: sendEvent flag, 7 LSB: index in upnptypes */
    unsigned char idefault; /* default value */
    unsigned char iallowedlist; /* index in allowed values list */
    unsigned char ieventvalue;  /* fixed value returned or magical values */
    unsigned char iallowedvaluerange; /*index in value ranges list */
};

/**
 *  @brief generate the root description of the upnp device
 *  @param[out] len argument is used to return the length of the returned string.
 *  @return[out] return root desc char*
 */
char* gen_root_desc(int* len);

/**
 *  @brief generate the ConnectionManager xml description
 *  @param[out] len argument is used to return the length of the returned string.
 *  @return[out] return connection manager char*
 */
char* gen_connection_manager_scpd(int* len);

/**
 *  @brief generate the AVTransport xml description
 *  @param[out] len argument is used to return the length of the returned string.
 *  @return[out] return AVTransport desc char*
 */
char* gen_av_transport_scpd(int* len);

/**
 *  @brief generate the RenderingControl  xml description
 *  @param[out] len argument is used to return the length of the returned string.
 *  @return[out] return RenderingControl desc char*
 */
char* gen_rendering_control_scpd(int* len);

#ifdef __cplusplus
}
#endif

#endif // BAIDU_IOT_TINYDU_IOT_OS_SRC_MINIUPNPRENDER_UPNPDESCGEN_H
